home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / xwindows / demos / xfract_1.z / xfract_1 / xfractint-1.06 / fracsubr.c < prev    next >
C/C++ Source or Header  |  1992-09-28  |  34KB  |  1,122 lines

  1. /*
  2. FRACSUBR.C contains subroutines which belong primarily to CALCFRAC.C and
  3. FRACTALS.C, i.e. which are non-fractal-specific fractal engine subroutines.
  4. */
  5.  
  6. #include <stdio.h>
  7. #ifndef XFRACT
  8. #include <stdarg.h>
  9. #else
  10. #include <varargs.h>
  11. #endif
  12. #include <float.h>
  13. #include <sys/types.h>
  14. #include <sys/timeb.h>
  15. #include <stdlib.h>
  16. #include "fractint.h"
  17. #include "fractype.h"
  18. #include "mpmath.h"
  19. #include "prototyp.h"
  20.  
  21. /* routines in this module    */
  22.  
  23. static long   _fastcall fudgetolong(double d);
  24. static double _fastcall fudgetodouble(long l);
  25. static void   _fastcall adjust_to_limits(double);
  26. static void   _fastcall smallest_add(double *);
  27. static int    _fastcall ratio_bad(double,double);
  28. static void   _fastcall plotdorbit(double,double,int);
  29. static int    _fastcall combine_worklist(void);
  30.  
  31.  
  32. extern int    calc_status;        /* status of calculations */
  33. extern char far *resume_info;        /* pointer to resume info if allocated */
  34.        int    resume_len;        /* length of resume info */
  35. static int    resume_offset;        /* offset in resume info gets */
  36. extern double plotmx1,plotmx2,plotmy1,plotmy2; /* real->screen conversion */
  37. extern int    orbit_ptr;        /* pointer into save_orbit array */
  38. extern int orbit_delay;         /* orbit delay value */
  39. extern int far *save_orbit;        /* array to save orbit values */
  40. extern int    orbit_color;        /* XOR color */
  41. extern int    num_worklist;        /* resume worklist for standard engine */
  42. extern int    fractype;         /* fractal type */
  43. extern char   stdcalcmode;        /* '1', '2', 'g', 'b'       */
  44. extern char   floatflag;        /* floating-point fractals? */
  45. extern int    integerfractal;        /* TRUE if fractal uses integer math */
  46. extern struct workliststuff worklist[MAXCALCWORK];
  47. extern int    sxdots,sydots;        /* # of dots on the physical screen    */
  48. extern int    sxoffs,syoffs;        /* physical top left of logical screen */
  49. extern int    xdots, ydots;        /* # of dots on the logical screen     */
  50. extern int    colors;            /* maximum colors available */
  51. extern long   fudge;            /* fudge factor (2**n) */
  52. extern int    bitshift;         /* bit shift for fudge */
  53. extern int    inside;            /* inside color: 1=blue     */
  54. extern int    outside;            /* outside color    */
  55. extern double xxmin,xxmax,yymin,yymax,xx3rd,yy3rd; /* corners */
  56. extern long   xmin, xmax, ymin, ymax, x3rd, y3rd;  /* integer equivs */
  57. extern int    maxit;            /* try this many iterations */
  58. extern int    attractors;        /* number of finite attractors    */
  59. extern struct complex  attr[];        /* finite attractor vals (f.p)    */
  60. extern struct lcomplex lattr[];     /* finite attractor vals (int)    */
  61. extern int    attrperiod[];         /* finite attractor period    */
  62. extern struct complex  old,new;
  63. extern struct lcomplex lold,lnew;
  64. extern double tempsqrx,tempsqry;
  65. extern long   ltempsqrx,ltempsqry;
  66. extern int    xxstart,xxstop;        /* these are same as worklist, */
  67. extern int    yystart,yystop,yybegin;    /* declared as separate items  */
  68. extern int    periodicitycheck;
  69. extern int    basin;
  70. extern int    finattract;
  71. extern int    pixelpi;            /* value of pi in pixels */
  72. extern double closenuff;
  73. extern long   lclosenuff;
  74. extern int    ixstart, ixstop, iystart, iystop;
  75. extern int    color;
  76. extern int    decomp[];
  77. extern double potparam[3];        /* three potential parameters*/
  78. extern int    distest;            /* non-zero if distance estimator */
  79. extern double param[4];         /* up to four parameters */
  80. extern int    invert;            /* non-zero if inversion active */
  81. extern int    biomorph,usr_biomorph;
  82. extern int    debugflag; /* internal use only - you didn't see this */
  83. extern long   creal, cimag;        /* for calcmand */
  84. extern long   delx, dely;        /* screen pixel increments  */
  85. extern long   delx2, dely2;        /* screen pixel increments  */
  86. extern double delxx, delyy;        /* screen pixel increments  */
  87. extern double delxx2, delyy2;        /* screen pixel increments  */
  88. extern long   delmin;            /* for calcfrac/calcmand    */
  89. extern double ddelmin;            /* same as a double        */
  90. extern int    potflag;            /* continuous potential flag */
  91. extern int    bailout;
  92. extern double rqlim;
  93. extern double  dxsize, dysize;        /* xdots-1, ydots-1        */
  94. extern int soundflag;
  95. extern int basehertz;
  96.  
  97. extern long   far *lx0, far *ly0;    /* x, y grid            */
  98. extern long   far *lx1, far *ly1;    /* adjustment for rotate    */
  99. /* note that lx1 & ly1 values can overflow into sign bit; since     */
  100. /* they're used only to add to lx0/ly0, 2s comp straightens it out  */
  101. extern double far *dx0, far *dy0;    /* floating pt equivs */
  102. extern double far *dx1, far *dy1;
  103.  
  104. extern char   usr_floatflag;
  105. extern char   usr_stdcalcmode;
  106. extern int    usr_periodicitycheck;
  107. extern int    usr_distest;
  108.  
  109. #define FUDGEFACTOR    29    /* fudge all values up by 2**this */
  110. #define FUDGEFACTOR2    24    /* (or maybe this)          */
  111.  
  112.  
  113. void calcfracinit() /* initialize a *pile* of stuff for fractal calculation */
  114. {
  115.    int i;
  116.    double ftemp;
  117.  
  118.    floatflag = usr_floatflag;
  119.    if (calc_status == 2) /* on resume, ensure floatflag correct */
  120.       if (curfractalspecific->isinteger)
  121.      floatflag = 0;
  122.       else
  123.      floatflag = 1;
  124.  
  125. init_restart:
  126.  
  127.    /* the following variables may be forced to a different setting due to
  128.       calc routine constraints;  usr_xxx is what the user last said is wanted,
  129.       xxx is what we actually do in the current situation */
  130.    stdcalcmode        = usr_stdcalcmode;
  131.    periodicitycheck = usr_periodicitycheck;
  132.    distest        = usr_distest;
  133.    biomorph        = usr_biomorph;
  134.  
  135.    potflag = 0;
  136.    if (potparam[0] != 0.0
  137.      && colors >= 64
  138.      && (curfractalspecific->calctype == StandardFractal
  139.      || curfractalspecific->calctype == calcmand
  140.      || curfractalspecific->calctype == calcmandfp)) {
  141.       potflag = 1;
  142.       distest = 0;    /* can't do distest too */
  143.       }
  144.  
  145.    if (distest)
  146.       floatflag = 1;  /* force floating point for dist est */
  147.  
  148.    if (floatflag) { /* ensure type matches floatflag */
  149.       if (curfractalspecific->isinteger != 0
  150.     && curfractalspecific->tofloat != NOFRACTAL)
  151.      fractype = curfractalspecific->tofloat;
  152.       }
  153.    else {
  154.       if (curfractalspecific->isinteger == 0
  155.     && curfractalspecific->tofloat != NOFRACTAL)
  156.      fractype = curfractalspecific->tofloat;
  157.       }
  158.    curfractalspecific = &fractalspecific[fractype];
  159.  
  160.    integerfractal = curfractalspecific->isinteger;
  161.  
  162.    if (fractype == JULIBROT)
  163.       rqlim = 4;
  164.    else if (potflag && potparam[2] != 0.0)
  165.       rqlim = potparam[2];
  166. /* else if (decomp[0] > 0 && decomp[1] > 0)
  167.       rqlim = (double)decomp[1]; */
  168.    else if (bailout) /* user input bailout */
  169.       rqlim = bailout;
  170.    else if (biomorph != -1) /* biomorph benefits from larger bailout */
  171.       rqlim = 100;
  172.    else
  173.       rqlim = curfractalspecific->orbit_bailout;
  174.    if (integerfractal) /* the bailout limit mustn't be too high here */
  175.       if (rqlim > 127.0) rqlim = 127.0;
  176.  
  177.    if ((curfractalspecific->flags&NOROTATE) != 0) {
  178.       /* ensure min<max and unrotated rectangle */
  179.       if (xxmin > xxmax) { ftemp = xxmax; xxmax = xxmin; xxmin = ftemp; }
  180.       if (yymin > yymax) { ftemp = yymax; yymax = yymin; yymin = ftemp; }
  181.       xx3rd = xxmin; yy3rd = yymin;
  182.       }
  183.  
  184.    /* set up bitshift for integer math */
  185.    bitshift = FUDGEFACTOR2; /* by default, the smaller shift */
  186.    if (integerfractal > 1)  /* use specific override from table */
  187.       bitshift = integerfractal;
  188.    if (integerfractal == 0) /* float? */
  189.       if ((i = curfractalspecific->tofloat) != NOFRACTAL) /* -> int? */
  190.      if (fractalspecific[i].isinteger > 1) /* specific shift? */
  191.         bitshift = fractalspecific[i].isinteger;
  192.  
  193. /* We want this code if we're using the assembler calcmand */
  194.    if (fractype == MANDEL || fractype == JULIA) { /* adust shift bits if.. */
  195.       if (potflag == 0                  /* not using potential */
  196.     && (fractype != MANDEL              /* and not an int mandel */
  197.         || (param[0] == 0.0 && param[1] == 0.0))  /* w/ "fudged" params */
  198.     && !invert                  /* and not inverting */
  199.     && biomorph == -1              /* and not biomorphing */
  200.     && rqlim <= 4.0               /* and bailout not too high */
  201.     && (outside > -2 || outside < -5)      /* and no funny outside stuff */
  202.     && debugflag != 1234)              /* and not debugging */
  203.      bitshift = FUDGEFACTOR;          /* use the larger bitshift */
  204.       if (param[0] < -1.99 || param[0] > 1.99) param[0] = 1.99;
  205.       if (param[1] < -1.99 || param[1] > 1.99) p